البرمجة

تأمين تطبيق Node.js باستخدام Docker

تأمين تطبيق Node.js يعمل على الحاويات باستخدام Nginx و Let’s Encrypt و Docker Compose

في عصر الأنظمة المتطورة والموارد السحابية، أصبح من الضروري تأمين تطبيقات الويب، سواء كانت تعمل على الخوادم التقليدية أو الحاويات (Containers). في هذا السياق، سنعرض كيفية تأمين تطبيق Node.js يعمل في بيئة حاويات باستخدام Nginx كخادم عكسي (Reverse Proxy)، و Let’s Encrypt للحصول على شهادات SSL مجانية، بالإضافة إلى استخدام Docker Compose لإدارة الحاويات بشكل فعال.

مقدمة

يعد Node.js منصة مفتوحة المصدر لبناء تطبيقات الخوادم باستخدام JavaScript. على الرغم من قوتها وسرعتها في التعامل مع الطلبات المتعددة، إلا أن تأمينها في بيئة الإنتاج يعد أمرًا بالغ الأهمية. من أجل ضمان سرية البيانات وتوفير اتصال آمن، نحتاج إلى استخدام تقنيات مثل SSL/TLS لتشفير الاتصال بين الخوادم والعملاء. واحدة من أسهل وأرخص الطرق للحصول على شهادات SSL هي عبر Let’s Encrypt، الذي يوفر شهادات SSL مجانية.

Nginx، من جهة أخرى، يعد خادماً عكسياً ممتازاً لتمرير الطلبات إلى تطبيقات خلفية مثل Node.js، بالإضافة إلى مزايا إضافية مثل التحكم في حركة المرور، توزيع الحمل، وتحسين الأداء.

أخيرًا، Docker Compose يوفر طريقة مثالية لإدارة التطبيقات متعددة الحاويات، مما يسهل نشر وتوزيع تطبيق Node.js في بيئات معقدة.

المتطلبات الأساسية

قبل البدء في بناء التطبيق وتأمينه، يجب التأكد من أنك تمتلك العناصر الأساسية التالية:

  1. خادم Linux: يجب أن يعمل التطبيق على خادم Linux أو جهاز افتراضي.

  2. Docker: لتشغيل التطبيقات داخل الحاويات.

  3. Docker Compose: لتسهيل إدارة الحاويات.

  4. Nginx: لإعداد الخادم العكسي.

  5. Let’s Encrypt: للحصول على شهادة SSL.

الخطوة 1: إعداد بيئة Docker

أولاً، تحتاج إلى إنشاء ملفات Docker الخاصة بتطبيق Node.js و Nginx. سيستخدم Docker Compose لربط الحاويات وتسهيل نشرها.

إنشاء ملف Dockerfile لتطبيق Node.js

ابدأ بإنشاء Dockerfile خاص بتطبيق Node.js الذي سيشمل جميع الإعدادات المطلوبة لتشغيل التطبيق في حاوية Docker.

dockerfile
# استخدام الصورة الرسمية لـ Node.js FROM node:14 # تعيين المجلد العمل في الحاوية WORKDIR /usr/src/app # نسخ ملفات المشروع إلى الحاوية COPY package*.json ./ # تثبيت التبعيات RUN npm install # نسخ ملفات التطبيق إلى الحاوية COPY . . # تعيين البورت الذي سيعمل عليه التطبيق EXPOSE 3000 # تشغيل التطبيق CMD ["node", "app.js"]

إنشاء ملف docker-compose.yml

الآن، سنقوم بإعداد Docker Compose لربط الحاويات. سيكون لدينا حاويتين: واحدة لتطبيق Node.js والأخرى لـ Nginx.

yaml
version: '3' services: node-app: build: . container_name: node-app environment: - NODE_ENV=production ports: - "3000:3000" nginx: image: nginx:latest container_name: nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - "80:80" - "443:443" depends_on: - node-app

الخطوة 2: إعداد Nginx كخادم عكسي

نحتاج الآن إلى إعداد Nginx كخادم عكسي لتوجيه الطلبات الواردة من العملاء إلى تطبيق Node.js. ستقوم Nginx بمعالجة حركة المرور على البورت 80 (HTTP) و 443 (HTTPS).

إنشاء ملف nginx.conf

nginx
server { listen 80; server_name yourdomain.com www.yourdomain.com; location / { proxy_pass http://node-app:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # إعادة التوجيه إلى HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name yourdomain.com www.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://node-app:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

في هذا الملف، نعمل على:

  1. إعداد الخادم للاستماع على البورتين 80 و 443.

  2. إعادة توجيه حركة المرور من HTTP إلى HTTPS.

  3. إعداد proxy_pass لتوجيه الطلبات إلى تطبيق Node.js على البورت 3000.

الخطوة 3: إعداد Let’s Encrypt للحصول على شهادة SSL

الخطوة التالية هي إعداد Let’s Encrypt للحصول على شهادة SSL وتثبيتها على Nginx.

تثبيت Certbot

Certbot هو أداة تتيح لك الحصول على شهادة SSL مجانية من Let’s Encrypt وتثبيتها على خادمك.

bash
sudo apt update sudo apt install certbot python3-certbot-nginx

الحصول على شهادة SSL

بمجرد تثبيت Certbot، يمكنك الحصول على الشهادة باستخدام الأمر التالي:

bash
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

سيقوم Certbot تلقائيًا بإنشاء شهادة SSL وتثبيتها على خادم Nginx.

الخطوة 4: إعداد إعادة التحميل التلقائي للشهادات

Let’s Encrypt تصدر الشهادات لمدة 90 يومًا فقط، لذا من الضروري إعداد Cron Job لتجديد الشهادات تلقائيًا.

إعداد Cron Job لتجديد الشهادة

bash
sudo crontab -e

ثم أضف السطر التالي لتجديد الشهادة بشكل دوري:

bash
0 12 * * * certbot renew --quiet && systemctl reload nginx

الخطوة 5: تشغيل Docker Compose

الآن بعد أن أعددنا جميع الحاويات وتهيئة Nginx و Let’s Encrypt، يمكننا تشغيل التطبيق باستخدام Docker Compose.

تشغيل الحاويات

bash
docker-compose up -d

سيتم الآن تشغيل التطبيق في بيئة الإنتاج باستخدام Docker و Nginx، مع شهادة SSL من Let’s Encrypt.

الخطوة 6: التحقق من عمل التطبيق بشكل صحيح

بمجرد تشغيل الحاويات، يمكنك التحقق من أن كل شيء يعمل بشكل صحيح بفتح متصفحك والانتقال إلى:

arduino
https://yourdomain.com

يجب أن ترى التطبيق يعمل بشكل صحيح مع اتصال آمن (علامة القفل بجانب الرابط).

الخاتمة

لقد استعرضنا في هذا المقال كيفية تأمين تطبيق Node.js يعمل في بيئة Docker باستخدام Nginx كخادم عكسي، بالإضافة إلى استخدام Let’s Encrypt للحصول على شهادة SSL مجانية. هذه الطريقة توفر بيئة آمنة وسريعة لتطبيقات Node.js، مما يضمن حماية البيانات ومنع التنصت من قبل الأطراف الثالثة.

إعداد Docker Compose يسهل عملية نشر التطبيق وإدارته، مما يجعله خيارًا مثاليًا للمشاريع الصغيرة والمتوسطة. من خلال هذه الخطوات، يمكن للمطورين ضمان أن تطبيقاتهم تعمل في بيئة آمنة، وأن حركة المرور بين المستخدمين والخوادم مشفرة بشكل كامل.